import axios from 'axios'
import { request } from './request'

const api = {
  auth: `/file/auth`,
  add: `/file/add`,
  delete: `/file/delete`,
  edit: `/file/edit`,
  detail: `/file/detail`,
  pageList: `/file/pageList`,
}

export interface IAddFileParams {
  categoryId: string | number
  fileDesc: string
  fileId: string
}

/**
 * 增加文件
 * @param {Objecet} parameter
 * @param {Number} parameter.categoryId
 * @param {String} parameter.fileDesc
 * @param {Number} parameter.fileId
 */
export function addFile(parameter: IAddFileParams) {
  return request({
    url: api.add,
    method: 'post',
    params: parameter,
  })
}

export interface IDelFileParams {
  fileId: string
}

/**
 * 删除文件
 * @param {String} fileId
 */
export function deleteFile(fileId: IDelFileParams) {
  return request({
    url: `${api.delete}/${fileId}`,
    method: 'delete',
  })
}

/**
 * 编辑文件
 * @param {Object} parameter
 * @param {Object} parameter.categoryId
 * @param {Object} parameter.fileDesc
 * @param {Object} parameter.fileId
 */
export function editFile(parameter: IAddFileParams) {
  return request({
    url: api.edit,
    method: 'put',
    params: parameter,
  })
}

/**
 * 获取文件详情
 * @param {String} fileId
 */
export function getFileDetail(fileId: IDelFileParams) {
  return request({
    url: `${api.detail}/${fileId}`,
    method: 'get',
  })
}

export interface IFileListParams {
  categoryId: string | number
  fileName: string
  pageNum: number
  pageSize: number
}
/**
 * 获取文件列表
 * @param {Object} parameter
 * @param {Number} parameter.categoryId
 * @param {String} parameter.fileName
 * @param {Number} parameter.pageNum
 * @param {Number} parameter.pageSize
 */
export function getFileList(parameter: IFileListParams) {
  return request({
    url: api.pageList,
    method: 'post',
    data: parameter,
  })
}

export interface IAuthInfo {
  accountId: string
  bizType: string
  categoryId: string
  fileDesc: string
  fileOriginalName: string
  isUseOriginalName: string
}

/**
 * 获取文件上传凭证
 * @param {} parameter.accountId //账户Id
 * @param {} parameter.bizType //文件业务类型
 * @param {} parameter.categoryId //所在目录id
 * @param {} parameter.fileDesc //文件描述
 * @param {} parameter.fileOriginalName // 文件原始名称
 * @param {} parameter.isUseOriginalName // 是否使用原始名称 0：默认值，系统自动生成， 1：使用源文件名
 *
 */
export function getAuthInfo(parameter: IAuthInfo) {
  return request({
    url: api.auth,
    method: 'post',
    params: parameter,
  })
}

export interface IUploadToAliOSSParams {
  accessId: string
  policy: string
  signature: string
  callback: string
  filePath: string
  fileId: string
  file: string
  expire?: string
  host?: string
}
/**
 *
 * @param {*} parameter
 * @param {} parameter.accessId accessKeyId
 * @param {} parameter.policy	上传策略
 * @param {} parameter.signature	签名
 * @param {} parameter.callback	OSS往这个服务器发送的URL请求。
 * @param {} parameter.filePath	文件路径
 * @param {} parameter.fileId	文件Id
 * @param {} parameter.file	上传的文件
 * @param {} parameter.expire	有效时间
 * @param {} parameter.host	OSS发送这个请求时，请求头部所带的Host头。
 * https://help.aliyun.com/document_detail/31927.html?spm=5176.doc31988.6.633.OTY557
 */
export function uploadToAliOSS(
  parameter: IUploadToAliOSSParams,
  onUploadProgress: () => {}
) {
  const {
    host,
    accessId,
    policy,
    signature,
    filePath,
    file,
    callback,
    fileId,
  } = parameter
  const formData = new FormData()
  formData.append('OSSAccessKeyId', accessId) // Bucket 拥有者的Access Key Id。
  formData.append('policy', policy) // policy规定了请求的表单域的合法性
  formData.append('signature', signature) // 根据Access Key Secret和policy计算的签名信息，OSS验证该签名信息从而验证该Post请求的合法性
  formData.append('callback', callback) // 文件名字，可设置路径
  formData.append('key', filePath) // 文件名字，可设置路径
  formData.append('success_action_status', '200') // 让服务端返回200,不然，默认会返回204
  formData.append('file', file) // 需要上传的文件 file
  formData.append('fileId', fileId)
  // formData.append('fileDesc', '测试')
  // formData.append('fileOriginalName', fileName)
  return axios({
    method: 'post',
    url: host,
    data: formData,
    onUploadProgress,
  })
}
